package main

import (
	"fmt"
	"time"
)

func createWorker(id int) chan<- int{
	c:= make(chan int)
	go func() {
		for {
			fmt.Printf("%d %c\n",id,<-c)
		}
	}()
	return c
}

func worker(id int,c chan int){
	for {
		n,ok :=<-c
		if !ok{
			break
		}
		fmt.Printf("%d %c\n",id,n)
	}
}

func worker2(id int,c chan int){
	for n:= range c{
		fmt.Printf("worker %d %d\n",id,n)
	}
}

func chanDemo(){

	var channels [10]chan<- int
	for i:=0;i<10;i++{
		channels[i] = createWorker(i)
	}
	for i:= 0;i<10;i++{
		channels[i] <- 'a'+i
	}
	for i:= 0;i<10;i++{
		channels[i] <- 'A'+i
	}
	time.Sleep(time.Millisecond)
}

func buggeredChannel(){
	c:= make(chan int,3)
	go worker(0,c)
	c<-'a'
	c<-'b'
	c<-'c'
	time.Sleep(time.Millisecond)
}

func channelClose(){
	c:= make(chan int)
	go worker(0,c)
	go worker2(0,c)
	c<-'a'
	c<-'b'
	c<-'c'
	close(c)
	time.Sleep(time.Millisecond)
}

func main(){
	//chanDemo()
	//buggeredChannel()
	channelClose()
}

